from pyparsing import col
from sklearn.cluster import DBSCAN
import numpy as np
import matplotlib.pyplot as plt

# multiply and add by random numbers to get some real values
np.random.seed(1)
#生成一个五百行两列的数，*20变成 0-20的范围   +20变成 20-40 的范围
random_data = np.random.randn(500,2)  * 20 + 20
#print(random_data)
#模拟 生成边界数
random_data_outliers = np.random.randn(100,2)  * 30 + 50
# 合并
random_total  = np.concatenate((random_data,random_data_outliers),axis=0)
#需要的是x和y的坐标 因此例子是500*2的数据 两列
plt.scatter(random_total[:,0],random_total[:,1]) #x的第0列绘制在横轴，x的第1列绘制在纵轴
plt.show()

# 调用包生成模型
# min_samples 半径内的数   eps 半径
model = DBSCAN(min_samples = 2, eps = 3)
# 利用模型进行预测，检测
preds = model.fit_predict(random_total)
print(preds)

outliers = []
for idx, item in enumerate(preds):
    if item == -1:
        outliers.append(random_total[idx])
#preds == -1 就是异常点 就放在outliers里
#preds == 1 就是核心点
#preds > 1  就是边界点

colors = []
for idx, item in enumerate(preds):
    if item == -1:
        colors.append('r')
        continue
    if item > 1:
        colors.append('g')
        continue
    colors.append('b')

#可视化预测结果
plt.scatter(random_total[:,0],random_total[:,1],c=colors)  #样本点的颜色由y值决定
plt.show()